/**
 * 
 */
package com.bbcare.comm;

import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.text.StrTokenizer;

/*
 * @name:         IpUtils.java
 * @author:       tao
 * @createTime:   2018年7月26日
 * @description:  IpUtils.java
 * @modify:
 * 
 */
public class IpUtils {
	public static final String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
	public static final Pattern pattern = Pattern.compile("^(?:" + _255 + "\\.){3}" + _255 + "$");
 
	public static String longToIpV4(long longIp) {
		int octet3 = (int) ((longIp >> 24) % 256);
		int octet2 = (int) ((longIp >> 16) % 256);
		int octet1 = (int) ((longIp >> 8) % 256);
		int octet0 = (int) ((longIp) % 256);
		return octet3 + "." + octet2 + "." + octet1 + "." + octet0;
	}
 
	public static long ipV4ToLong(String ip) {
		String[] octets = ip.split("\\.");
		return (Long.parseLong(octets[0]) << 24) + (Integer.parseInt(octets[1]) << 16)
				+ (Integer.parseInt(octets[2]) << 8) + Integer.parseInt(octets[3]);
	}
 
	public static boolean isIPv4Private(String ip) {
		long longIp = ipV4ToLong(ip);
		return (longIp >= ipV4ToLong("10.0.0.0") && longIp <= ipV4ToLong("10.255.255.255"))
				|| (longIp >= ipV4ToLong("172.16.0.0") && longIp <= ipV4ToLong("172.31.255.255"))
				|| longIp >= ipV4ToLong("192.168.0.0") && longIp <= ipV4ToLong("192.168.255.255");
	}
 
	public static boolean isIPv4Valid(String ip) {
		return pattern.matcher(ip).matches();
	}
	
	/**获取真实IP地址  伪造ip不能区分*/
	public static String getIpFromRequest(HttpServletRequest request) {
		String ip;
		ip = getRealIp(request.getHeader("x-forwarded-for"));
		if(StringUtils.isEmpty(ip)){
			ip = getRealIp(request.getHeader("Proxy-Client-IP"));
		}
		if(StringUtils.isEmpty(ip)){
			ip = getRealIp(request.getHeader("WL-Proxy-Client-IP"));
		}
		if(StringUtils.isEmpty(ip)){
			ip = request.getRemoteAddr();
		}
		if (ip.contains(",")) {
	        return ip.split(",")[0].replace(":",".");
	    } else {
	        return ip.replace(":",".");
	    }
	}

	private static String getRealIp(String ip){
		if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)){
			StrTokenizer tokenizer = new StrTokenizer(ip, ",");
			while (tokenizer.hasNext()) {
				ip = tokenizer.nextToken().trim();
				if (isIPv4Valid(ip) && !isIPv4Private(ip)) {
					return ip;
				}
			}
		}
		return null;
	}

}
